// Slide.java
package exercise.jslide.jslide.model;

import javafx.geometry.Point2D;
import javafx.scene.canvas.GraphicsContext;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>{@code Slide} 类用于表示一个幻灯片。
 * 一个幻灯片包含多个幻灯片元素，以及背景颜色。
 * 该类实现了 {@code Serializable} 接口，可以被序列化。</p>
 * <p>该类包含了幻灯片元素列表、背景颜色等属性。</p>
 * <p>该类提供了添加、删除、获取幻灯片元素、设置背景颜色、将元素置于最前、置于最后、根据 ID 查找元素、查找指定坐标处的元素等方法。</p>
 * <p>该类还包含了绘制缩略图的方法，用于在主视图中显示幻灯片的缩略图。</p>
 */
public class Slide implements Serializable {
    private List<SlideElement> elements;
    private String background;

    /**
     * 该构造方法用于初始化一个 {@code Slide} 对象。
     * 在构造方法中，初始化了幻灯片元素列表 {@code elements}，
     * 同时，初始化了背景颜色 {@code background} 为白色。
     */
    public Slide() {
        elements = new ArrayList<>();
        background = "#FFFFFF"; // 默认白色背景
    }

    /**
     * 该方法用于向幻灯片中添加一个幻灯片元素。
     * @param element  要添加的幻灯片元素
     */
    public void addElement(SlideElement element) {
        elements.add(element);
    }

    /**
     * 该方法用于从幻灯片中删除一个幻灯片元素。
     * @param element 要删除的幻灯片元素
     */
    public void removeElement(SlideElement element) {
        elements.remove(element);
    }

    /**
     * 该方法用于获取幻灯片中的所有幻灯片元素。
     * @return
     */
    public List<SlideElement> getElements() {
        return elements;
    }

    /**
     * 该方法用于得到幻灯片的背景颜色。
     * @return  background 要设置的背景颜色
     */
    public String getBackground() {
        return background;
    }

    /**
     * 该方法用于设置幻灯片的背景颜色。
     * @param background 要设置的背景颜色
     */
    public void setBackground(String background) {
        this.background = background;
    }

    /**
     * 该方法用于将指定的幻灯片元素置于最前。
     * @param element
     */
    public void bringToFront(SlideElement element) {
        if (elements.remove(element)) {
            elements.add(element);
        }
    }

    /**
     * 该方法用于将指定的幻灯片元素置于最后。
     * @param element
     */
    public void sendToBack(SlideElement element) {
        if (elements.remove(element)) {
            elements.add(0, element);
        }
    }

    /**
     * 该方法用于根据 ID 查找幻灯片元素。
     * @param id
     * @return 如果找到指定 ID 的幻灯片元素，则返回该元素；否则返回 null。
     */
    public SlideElement getElementById(String id) {
        return elements.stream()
                .filter(e -> e.getId().equals(id))
                .findFirst()
                .orElse(null);
    }

    /**
     * 该方法用于查找指定坐标处的幻灯片元素。
     * @param x 指定的 x 坐标
     * @param y 指定的 y 坐标
     * @return 如果找到指定坐标处的幻灯片元素，则返回该元素；否则返回 null。
     */
    public SlideElement findElementAt(double x, double y) {
        for (int i = elements.size() - 1; i >= 0; i--) {
            SlideElement element = elements.get(i);
            if (element.contains(new Point2D(x, y))) {
                return element;
            }
        }
        return null;
    }

    /**
     * 该方法用于绘制幻灯片的缩略图。
     * @param gc
     */
    public void drawThumbnail(GraphicsContext gc) {
        gc.setFill(javafx.scene.paint.Color.web(background));
        gc.fillRect(0, 0, 200, 150);

        for (SlideElement element : elements) {
            gc.save();
            element.drawThumbnail(gc);
            gc.restore();
        }
    }
}